package com.milo.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * RabbitMq公共Service
 */
@Service
@Slf4j
public class    RabbitMQService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * rabbitmq 发送核心方法
     *
     * @param mqDto 消息体
     */
    public void convertAndSend(MqDto mqDto) {
        rabbitTemplate.convertAndSend(mqDto.getExchange(), mqDto.getRoutingKey(), mqDto.getBody(), message -> {
            message.getMessageProperties().setCorrelationId(mqDto.getMessageId());
            message.getMessageProperties().setMessageId(mqDto.getMessageId());
            return message;
        });
    }

    /**
     * rabbitmq 发送消息获取返回值
     *
     * @param mqDto 消息体
     */
    public Object convertSendAndReceive(MqDto mqDto) {
        return rabbitTemplate.convertSendAndReceive(mqDto.getExchange(), mqDto.getRoutingKey(), mqDto.getBody(), message -> {
            message.getMessageProperties().setCorrelationId(mqDto.getMessageId());
            message.getMessageProperties().setMessageId(mqDto.getMessageId());
            return message;
        });
    }

    /**
     * rabbitmq 发送TTL消息
     * 需要设置超时时间
     *
     * @param mqDto 消息体
     */
    public void sendTTl(MqDto mqDto) {
        rabbitTemplate.convertAndSend(mqDto.getExchange(), mqDto.getRoutingKey(), mqDto.getBody(), message -> {
            message.getMessageProperties().setExpiration(mqDto.getExpire() + "");
            message.getMessageProperties().setCorrelationId(mqDto.getMessageId());
            message.getMessageProperties().setMessageId(mqDto.getMessageId());
            return message;
        });
    }

    /**
     * rabbitmq 发送消息,携带请求头
     * 需要设置超时时间
     *
     * @param mqDto 消息体
     */
    public void convertAndSendAndHeader(MqDto mqDto) {
        rabbitTemplate.convertAndSend(mqDto.getExchange(), mqDto.getRoutingKey(), mqDto.getBody(), message -> {
            message.getMessageProperties().setExpiration(mqDto.getExpire() + "");
            message.getMessageProperties().setCorrelationId(mqDto.getMessageId());
            message.getMessageProperties().setMessageId(mqDto.getMessageId());
            message.getMessageProperties().setHeader("","");
            return message;
        });
    }

}